using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Data.Common;
using Microsoft.Practices.EnterpriseLibrary.Data;
using Microsoft.Practices.EnterpriseLibrary.Common;
using Microsoft.Practices.ObjectBuilder;
using GC2.ExceptionHandler;
using GC2.ExceptionHandler.Services;
using GC2.Entities.Logistica;
using GC2.DataAccess;

namespace GC2.DataAccess.DALogistica
{
    public class DARodados
    {
        private Database _database;        // Objeto DataBase del Data Access Application Block

        #region Propiedades miembro
        /// <summary>
        /// Seteo la propiedad _database de la clase.
        /// </summary>
        private Database DataBase
        {
            get { return _database; }
            set { _database = value; }
        }
        #endregion

        #region Constructor
        /// <summary>
        /// Contructor de la clase sin parametro. Crea un objeto DataBase
        /// del Data AppBlock tomando el defaultDatabase del app.config.
        /// </summary>
        //public AplicacionesDataAccess()
        //{
        //    this.DataBase = DatabaseFactory.CreateDatabase();
        //}
        #endregion

        #region DARodadosInsert
        /// <summary>
        /// Inserta un nuevo Rodado
        /// </summary>
        /// <param name="Connection"></param>
        /// <param name="Rodados"></param>
        public void DARodadosInsert(string Connection, Rodados rodado)
        {
            this.DataBase = DatabaseFactory.CreateDatabase(Connection);
            DbCommand cmd = DataBase.GetStoredProcCommand("Rodados_Insert");

            try
            {
                using (cmd)
                {
                    DataBase.AddInParameter(cmd, "@Patente", DbType.String, rodado.Patente);
                    DataBase.AddInParameter(cmd, "@Sucursal", DbType.Int16, rodado.Sucursal);
                    DataBase.AddInParameter(cmd, "@Tipo", DbType.String, rodado.Tipo);
                    DataBase.AddInParameter(cmd, "@Marca", DbType.String, rodado.Marca);
                    DataBase.AddInParameter(cmd, "@Modelo", DbType.String, rodado.Modelo);
                    DataBase.AddInParameter(cmd, "@Anio", DbType.Int16, rodado.Anio);
                    DataBase.AddInParameter(cmd, "@Tara", DbType.String, rodado.Tara);
                    DataBase.AddInParameter(cmd, "@Chassis", DbType.String, rodado.Chassis);
                    DataBase.AddInParameter(cmd, "@Motor", DbType.String, rodado.Motor);
                    DataBase.AddInParameter(cmd, "@FechaIng", DbType.DateTime, rodado.FechaIng);
                    DataBase.AddInParameter(cmd, "@FechaBaja", DbType.DateTime, rodado.FechaBaja);
                    DataBase.AddInParameter(cmd, "@IdEstado", DbType.Int16, rodado.IdEstado);
                    DataBase.AddInParameter(cmd, "@Estado", DbType.String, rodado.Estado);
                    DataBase.AddInParameter(cmd, "@FechaEstado", DbType.DateTime, rodado.FechaEstado);
                    DataBase.AddInParameter(cmd, "@Seguro", DbType.String, rodado.Seguro);
                    DataBase.AddInParameter(cmd, "@FechaSeguro", DbType.DateTime, rodado.FechaSeguro);
                    DataBase.AddInParameter(cmd, "@KmActual", DbType.Int32, rodado.KmActual);
                    DataBase.AddInParameter(cmd, "@ServiG", DbType.Int32, rodado.ServiG);
                    DataBase.AddInParameter(cmd, "@ServiE", DbType.Int32, rodado.ServiE);
                    DataBase.AddInParameter(cmd, "@Cubiertas1", DbType.Int32, rodado.Cubiertas1);
                    DataBase.AddInParameter(cmd, "@Cubiertas2", DbType.Int32, rodado.Cubiertas2);
                    DataBase.AddInParameter(cmd, "@Obs", DbType.String, rodado.Obs);
                    DataBase.AddInParameter(cmd, "@Id_Usuario", DbType.Int16, rodado.Id_Usuario);

                    DataBase.ExecuteNonQuery(cmd);
                }
            }
            catch (SqlException sql_ex)
            {
                ExceptionSQL exNew = new ExceptionSQL();
                throw new System.Exception(exNew.exSQL(sql_ex.ToString()).ToString());
            }
            catch (Exception ex)
            {
                ExceptionDAL exNew = new ExceptionDAL();
                throw new System.Exception(exNew.exDAL(ex.ToString()).ToString());
            }
        }
        #endregion

        #region DARodadosGetOne
        /// <summary>
        /// Devuelve un Rodado por su Patente
        /// </summary>
        /// <param name="Connection"></param>
        /// <param name="Rodados"></param>
        /// <returns>Rodados</returns>
        public Rodados DARodadosGetOne(string Connection, Rodados rodado)
        {
            this.DataBase = DatabaseFactory.CreateDatabase(Connection);
            DbCommand cmd = DataBase.GetStoredProcCommand("Rodados_GetOne");

            List<Rodados> listRodados = new List<Rodados>();
            try
            {
                using (cmd)
                {
                    DataBase.AddInParameter(cmd, "@Patente", DbType.String, rodado.Patente);
                    IDataReader Odbreader = DataBase.ExecuteReader(cmd);
                    while (Odbreader.Read())
                    {
                        rodado.Patente = (string)Odbreader["Patente"];
                        rodado.Sucursal = (int)Odbreader["Sucursal"];
                        rodado.Tipo = (string)Odbreader["Tipo"];
                        rodado.Marca = (string)Odbreader["Marca"];
                        rodado.Modelo = (string)Odbreader["Modelo"];
                        rodado.Anio = Convert.ToInt16(Odbreader["Anio"]);
                        rodado.Tara = (string)Odbreader["Tara"];
                        rodado.Chassis = (string)Odbreader["Chassis"];
                        rodado.Motor = (string)Odbreader["Motor"];
                        rodado.FechaIng = (DateTime)Odbreader["FechaIng"];
                        rodado.FechaBaja = (DateTime)Odbreader["FechaBaja"];
                        rodado.IdEstado = (int)Odbreader["IdEstado"];
                        rodado.Estado = (string)Odbreader["Estado"];
                        rodado.FechaEstado = (DateTime)Odbreader["FechaEstado"];
                        rodado.Seguro = (string)Odbreader["Seguro"];
                        rodado.FechaSeguro = (DateTime)Odbreader["FechaSeguro"];
                        rodado.KmActual = Convert.ToInt32(Odbreader["KmActual"]);
                        rodado.ServiG = Convert.ToInt32(Odbreader["ServiG"]);
                        rodado.ServiE = Convert.ToInt32(Odbreader["ServiE"]);
                        rodado.Cubiertas1 = Convert.ToInt32(Odbreader["Cubiertas1"]);
                        rodado.Cubiertas2 = Convert.ToInt32(Odbreader["Cubiertas2"]);
                        rodado.Obs = (string)Odbreader["Obs"];
                        rodado.Id_Usuario = (int)Odbreader["Id_Usuario"];

                        listRodados.Add(rodado);
                    }
                    if (listRodados.Count == 0)
                    {
                        Rodados rodado0 = new Rodados();
                        return rodado0;
                    }
                    else
                    {
                        return listRodados[0];
                    }
                }
            }
            catch (SqlException sql_ex)
            {
                ExceptionSQL exNew = new ExceptionSQL();
                throw new System.Exception(exNew.exSQL(sql_ex.ToString()).ToString());
            }
            catch (Exception ex)
            {
                ExceptionDAL exNew = new ExceptionDAL();
                throw new System.Exception(exNew.exDAL(ex.ToString()).ToString());
            }
        }
        #endregion

        #region DARodadosGetAll
        /// <summary>
        /// Devuelve Lista de Rodados
        /// </summary>
        /// <param name="Connection"></param>
        /// <param name="Rodados"></param>
        /// <returns>Rodados</returns>
        public List<Rodados> DARodadosGetAll(string Connection)
        {
            this.DataBase = DatabaseFactory.CreateDatabase(Connection);
            DbCommand cmd = DataBase.GetStoredProcCommand("Rodados_GetAll");

            List<Rodados> listRodados = new List<Rodados>();
            try
            {
                using (cmd)
                {
                    IDataReader Odbreader = DataBase.ExecuteReader(cmd);
                    while (Odbreader.Read())
                    {
                        Rodados rodado = new Rodados();
                        rodado.Patente = (string)Odbreader["Patente"];
                        rodado.Sucursal = (int)Odbreader["Sucursal"];
                        rodado.Tipo = (string)Odbreader["Tipo"];
                        rodado.Marca = (string)Odbreader["Marca"];
                        rodado.Modelo = (string)Odbreader["Modelo"];
                        rodado.Anio = Convert.ToInt16(Odbreader["Anio"]);
                        rodado.Tara = (string)Odbreader["Tara"];
                        rodado.Chassis = (string)Odbreader["Chassis"];
                        rodado.Motor = (string)Odbreader["Motor"];
                        rodado.FechaIng = (DateTime)Odbreader["FechaIng"];
                        rodado.FechaBaja = (DateTime)Odbreader["FechaBaja"];
                        rodado.IdEstado = (int)Odbreader["IdEstado"];
                        rodado.Estado = (string)Odbreader["Estado"];
                        rodado.FechaEstado = (DateTime)Odbreader["FechaEstado"];
                        rodado.Seguro = (string)Odbreader["Seguro"];
                        rodado.FechaSeguro = (DateTime)Odbreader["FechaSeguro"];
                        rodado.KmActual = Convert.ToInt32(Odbreader["KmActual"]);
                        rodado.ServiG = Convert.ToInt32(Odbreader["ServiG"]);
                        rodado.ServiE = Convert.ToInt32(Odbreader["ServiE"]);
                        rodado.Cubiertas1 = Convert.ToInt32(Odbreader["Cubiertas1"]);
                        rodado.Cubiertas2 = Convert.ToInt32(Odbreader["Cubiertas2"]);
                        rodado.Obs = (string)Odbreader["Obs"];
                        rodado.Id_Usuario = (int)Odbreader["Id_Usuario"];

                        listRodados.Add(rodado);
                    }

                    return listRodados;
                }
            }
            catch (SqlException sql_ex)
            {
                ExceptionSQL exNew = new ExceptionSQL();
                throw new System.Exception(exNew.exSQL(sql_ex.ToString()).ToString());
            }
            catch (Exception ex)
            {
                ExceptionDAL exNew = new ExceptionDAL();
                throw new System.Exception(exNew.exDAL(ex.ToString()).ToString());
            }
        }
        #endregion

        #region DARodadosUpdate
        /// <summary>
        /// Actualiza un Rodado
        /// </summary>
        /// <param name="Connection"></param>
        /// <param name="Rodados"></param>
        public void DARodadosUpdate(string Connection, Rodados rodado)
        {
            this.DataBase = DatabaseFactory.CreateDatabase(Connection);
            DbCommand cmd = DataBase.GetStoredProcCommand("Rodados_Update");

            try
            {
                using (cmd)
                {
                    DataBase.AddInParameter(cmd, "@Patente", DbType.String, rodado.Patente);
                    DataBase.AddInParameter(cmd, "@Sucursal", DbType.Int16, rodado.Sucursal);
                    DataBase.AddInParameter(cmd, "@Tipo", DbType.String, rodado.Tipo);
                    DataBase.AddInParameter(cmd, "@Marca", DbType.String, rodado.Marca);
                    DataBase.AddInParameter(cmd, "@Modelo", DbType.String, rodado.Modelo);
                    DataBase.AddInParameter(cmd, "@Anio", DbType.Int16, rodado.Anio);
                    DataBase.AddInParameter(cmd, "@Tara", DbType.String, rodado.Tara);
                    DataBase.AddInParameter(cmd, "@Chassis", DbType.String, rodado.Chassis);
                    DataBase.AddInParameter(cmd, "@Motor", DbType.String, rodado.Motor);
                    DataBase.AddInParameter(cmd, "@FechaIng", DbType.DateTime, rodado.FechaIng);
                    DataBase.AddInParameter(cmd, "@FechaBaja", DbType.DateTime, rodado.FechaBaja);
                    DataBase.AddInParameter(cmd, "@IdEstado", DbType.Int16, rodado.IdEstado);
                    DataBase.AddInParameter(cmd, "@Estado", DbType.String, rodado.Estado);
                    DataBase.AddInParameter(cmd, "@FechaEstado", DbType.DateTime, rodado.FechaEstado);
                    DataBase.AddInParameter(cmd, "@Seguro", DbType.String, rodado.Seguro);
                    DataBase.AddInParameter(cmd, "@FechaSeguro", DbType.DateTime, rodado.FechaSeguro);
                    DataBase.AddInParameter(cmd, "@KmActual", DbType.Int32, rodado.KmActual);
                    DataBase.AddInParameter(cmd, "@ServiG", DbType.Int32, rodado.ServiG);
                    DataBase.AddInParameter(cmd, "@ServiE", DbType.Int32, rodado.ServiE);
                    DataBase.AddInParameter(cmd, "@Cubiertas1", DbType.Int32, rodado.Cubiertas1);
                    DataBase.AddInParameter(cmd, "@Cubiertas2", DbType.Int32, rodado.Cubiertas2);
                    DataBase.AddInParameter(cmd, "@Obs", DbType.String, rodado.Obs);
                    DataBase.AddInParameter(cmd, "@Id_Usuario", DbType.Int16, rodado.Id_Usuario);

                    DataBase.ExecuteNonQuery(cmd);
                }
            }
            catch (SqlException sql_ex)
            {
                ExceptionSQL exNew = new ExceptionSQL();
                throw new System.Exception(exNew.exSQL(sql_ex.ToString()).ToString());
            }
            catch (Exception ex)
            {
                ExceptionDAL exNew = new ExceptionDAL();
                throw new System.Exception(exNew.exDAL(ex.ToString()).ToString());
            }
        }
        #endregion
        
    }
}
